package com.martin.lib_base.model

import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import com.martin.lib_base.bean.common.BaseResponse
import com.martin.lib_base.interfaces.IGetData
import com.martin.lib_base.ktx.handle
import dev.utils.app.HandlerUtils

/**
 * @author：孟凡华
 * @date：2022/12/1
 * @desc：分页用工具
 */
class PageModel(private val iGetData: IGetData? = null) {

    // 页码
    val pageNum = mutableIntStateOf(1)

    // 页面总数
    val pageTotal = mutableIntStateOf(1)

    // 每页数量
    var pageSize = 10

    // 是否允许刷新
    val refreshEnabled = mutableStateOf(true)

    // 是否处于刷新中
    val refreshing = mutableStateOf(false)

    // 是否处于加载更多中
    val loading = mutableStateOf(false)

    // 数据列表
    val dataList = mutableStateListOf<Any>(emptyList<Any>())

    /**
     * 是否有更多数据
     * 用于决定刷新布局能否加载更多
     */
    val haveMore = mutableStateOf(false)

    // 展示空布局
    val showEmpty = mutableStateOf(false)

    // 随后请求事件
    private var lastTime = 0L

    // 最小间隔
    private val minInterval = 200L

    ///////////////////////////////////////////////////////////////////////////
    // 方法区
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 刷新
     */
    fun refresh() {
        if (!refreshEnabled.value || refreshing.value) {
            return
        }
        // 重置页码
        pageNum.intValue = 1
        // 设置加载状态
        refreshing.value = true
        // 刷新时,默认没有更多数据
        haveMore.value = false
        // 获取数据
        iGetData?.getData()
        lastTime = System.currentTimeMillis()
    }

    /**
     * 加载更多
     */
    fun loadMore() {
        // 如果没有更多数据或者正在加载中，直接返回
        if (!haveMore.value || loading.value || refreshing.value) {
            return
        }
        // 设置页码
        pageNum.intValue += 1
        // 设置加载状态
        loading.value = true
        // 获取数据
        iGetData?.getData()
        lastTime = System.currentTimeMillis()
    }

    /**
     * 当前是否为刷新模式
     */
    fun isRefresh() = pageNum.intValue == 1

    /**
     * 处理列表数据
     */
    fun handleList(list: List<Any>?) {
        if (isRefresh()) {
            dataList.clear()
        }
        dataList.addAll(list ?: emptyList())
        // 展示空布局
        showEmpty.value = dataList.isEmpty()
        // 关闭加载状态
        if (lastTime + minInterval > System.currentTimeMillis()) {
            HandlerUtils.postRunnable({
                finishLoading()
            }, minInterval)
        } else {
            finishLoading()
        }
    }

    /**
     * 关闭加载状态
     */
    fun finishLoading() {
        refreshing.value = false
        loading.value = false
    }

    /**
     * 处理listBean数据
     */
    fun handleData(listBean: BaseResponse<*>?) {
        handleList(listBean?.rows as List<Any>?)
        listBean.handle({
            pageTotal.intValue =
                if (it.total % pageSize > 0) it.total / pageSize + 1 else it.total / pageSize
            haveMore.value = pageTotal.intValue > pageNum.intValue
        }) {
            haveMore.value = false
        }
    }

    /**
     * 添加单个数据
     */
    fun addItem(item: Any, index: Int = -1) {
        if (index >= 0 && dataList.size > index) {
            dataList.add(index, item)
        } else {
            dataList.add(item)
        }
    }

    /**
     * 添加多个数据
     */
    fun addItems(items: List<Any>, index: Int = -1) {
        if (index >= 0 && dataList.size > index) {
            dataList.addAll(index, items)
        } else {
            dataList.addAll(items)
        }
    }

    /**
     * 删除单个数据
     */
    fun removeItem(item: Any) {
        dataList.remove(item)
    }

    /**
     * 删除单个数据
     */
    fun removeItem(index: Int) {
        if (dataList.size > index && index >= 0) {
            dataList.removeAt(index)
        }
    }

    /**
     * 删除多个数据
     */
    fun removeItems(items: List<Any>) {
        dataList.removeAll(items)
    }
}

